package main

import (
	"encoding/json"
	"fmt"
	"net/http"
)

func IndexHandle(w http.ResponseWriter, r *http.Request) {
	method := r.Method // 获取请求方法
	url := r.URL.Path  // 获取请求的URL
	header := r.Header // 获取请求头， 是一个映射类型
	fmt.Println(header)
	fmt.Fprintln(w, "请求方法："+method)
	fmt.Fprintln(w, "请求URL："+url)
	// 遍历请求头，获取键值对
	for key, value := range header {
		// fmt.Fprintln(w, key+":"+value[0])
		// 直接使用w写入，
		w.Write([]byte(key + ":" + value[0] + "\n"))
	}
}
func DetailHandle(w http.ResponseWriter, r *http.Request) {
	// 如果是GET请求，才会处理
	if r.Method == "GET" {
		// 获取GET传递的参数
		query := r.URL.Query()
		// map[price:[58.5] title:[golang]]
		fmt.Println("参数：", query)
		for key, value := range query {
			w.Write([]byte(key + ":" + value[0] + "\n"))
		}
		// w.Write([]byte("这是商品详情"))
	} else { //不是GET请求，不允许
		// w.WriteHeader(405)  // 设置状态码
		w.WriteHeader(http.StatusMethodNotAllowed)
		w.Write([]byte("Method Not Allowed"))
	}
}
func LoginHandle(w http.ResponseWriter, r *http.Request) {
	if r.Method == "POST" {
		w.Write([]byte("用户发起了POST请求"))
		// 1.获取POST传参中表单数据
		// r.ParseForm() // 需要先解析
		// // map[password:[123456] username:[tom]]
		// fmt.Println(r.Form)
		// for key, value := range r.Form {
		// 	w.Write([]byte(key + ":" + value[0] + "\n"))
		// }
		// 2.获取POST传参中JSON数据
		// 定义映射类型用于接收传递JSON数据
		var json_data map[string]interface{}
		// 将请求体中的数据进行解码，绑定给编码json_data
		json.NewDecoder(r.Body).Decode(&json_data)
		// map[password:123456 username:admin]
		fmt.Println(json_data)
		for key, value := range json_data {
			v, _ := value.(string) // 先进行断言
			w.Write([]byte(key + ":" + v + "\n"))
		}
	} else {
		w.WriteHeader(405)
		w.Write([]byte("方法不允许"))
	}
}

func main() {
	// 往http中注册路由
	// 客户端一旦请求/index，服务器端监听到请求，调用函数
	http.HandleFunc("/login", LoginHandle)
	http.HandleFunc("/index", IndexHandle)
	http.HandleFunc("/detail", DetailHandle)
	fmt.Println("服务器启动成功....")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		panic(err)
	}
}
